package com.wande.dataplatform.service;

import com.wande.common.mybatis.core.page.PageQuery;
import com.wande.common.mybatis.core.page.TableDataInfo;
import com.wande.dataplatform.domain.bo.DataApiBo;
import com.wande.dataplatform.domain.dto.ApiResponseDTO;
import com.wande.dataplatform.domain.dto.ApiStatisticsDTO;
import com.wande.dataplatform.domain.vo.ApiCallLogVO;
import com.wande.dataplatform.domain.vo.DataApiVO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 数据服务API Service接口
 *
 * @author wande
 */
public interface IDataApiService {

    /**
     * 查询数据服务API列表
     */
    TableDataInfo<DataApiVO> queryPageList(DataApiBo bo, PageQuery pageQuery);

    /**
     * 查询数据服务API列表
     */
    List<DataApiVO> queryList(DataApiBo bo);

    /**
     * 查询数据服务API详情
     */
    DataApiVO queryById(Long id);

    /**
     * 根据路径和版本查询API
     */
    DataApiVO queryByPathAndVersion(String path, String version);

    /**
     * 新增数据服务API
     */
    Long insertByBo(DataApiBo bo);

    /**
     * 修改数据服务API
     */
    Boolean updateByBo(DataApiBo bo);

    /**
     * 删除数据服务API
     */
    Boolean deleteById(Long id);

    /**
     * 批量删除数据服务API
     */
    Boolean deleteByIds(List<Long> ids);

    /**
     * 发布API
     */
    Boolean publishApi(Long id);

    /**
     * 下线API
     */
    Boolean offlineApi(Long id);

    /**
     * 调用API
     */
    ApiResponseDTO callApi(String path, String version, Map<String, Object> params, String token);

    /**
     * 测试API
     */
    ApiResponseDTO testApi(Long id, Map<String, Object> params);

    /**
     * 获取API统计信息
     */
    ApiStatisticsDTO getStatistics(Long id, LocalDate startDate, LocalDate endDate);

    /**
     * 查询API调用日志
     */
    TableDataInfo<ApiCallLogVO> queryCallLogs(Long apiId, PageQuery pageQuery);

    /**
     * 记录API调用日志
     */
    void logApiCall(Long apiId, String apiName, String apiPath, String caller, String callerIp,
                    String requestParams, String responseData, Integer statusCode,
                    Long responseTime, String errorMessage);
}
